iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Modern Web

Laravel 9 漫遊,享受魔法般的極速網頁開發體驗系列 第 18

Day 18:網站常用的寄信功能:Laravel 寄送 email 的開發與測試

  • 分享至 

  • xImage
  •  

網站除了要讓人閱覽,或者輸入資料以外,也常常會需要寄送一些信件。比方說忘記密碼時的通知信,或者訂單成功時的確認信等等。

一般來說,遇到這種需求,會想要開啟一個獨立的 Mail Server,然後透過呼叫 API 的方式,來讓該 Mail Server寄送信件。

不過,如果你不想這麼做,Laravel 也有一套寄信方式,可以透過和 SMTP Server 對接的方式,協助我們撰寫並且寄信件。

今天我們就來看看這部分的作法!

寄信服務

首先,我們來看看寄信服務的設置部分。

如果你是用 Laravel Sail 來開啟服務,那麼恭喜你,Laravel Sail 已經幫你做好一個模擬寄送信件的服務了。

讀者可以打開 http://127.0.0.1:8025/ 看看,如果順利的話,應該可以看到 mailhog 的畫面

mailhog

設置的部分,在 .env 裡面

MAIL_MAILER=smtp  
MAIL_HOST=mailhog  
MAIL_PORT=1025  
MAIL_USERNAME=null  
MAIL_PASSWORD=null  
MAIL_ENCRYPTION=null  
MAIL_FROM_ADDRESS="hello@example.com"  
MAIL_FROM_NAME="${APP_NAME}"

這邊的 Mailhog 是一個開源的專案,讓我們可以在開發時,能模擬 SMTP 服務,測試信件是否能正常寄送。避免我們在開發階段就不斷送信,導致費用提高的問題。

這次的教學內,筆者會以 Mailhog 作為範例,所以這些信件都只會在 Mailhog 後台中看到,不會實際的寄出。

確認我們的模擬寄信服務存在之後,我們就可以撰寫信件內容了

Mailable

Laravel 裡面定義信件的方式,是以 Mailable 物件作為定義。

要建立 Mailable 物件,又双叒叕是透過 artisan 協助我們建立

./vendor/bin/sail artisan make:mail OrderShipped

建立好之後,應該會在 app/Mail 資料夾底下看到 OrderShipped.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->view('view.name');
    }
}

看到 $this->view('view.name'),相信讀者應該感受到作法了:其實就跟我們撰寫網頁類似,寫一個 blade template,Laravel 就會自動幫我們處理好,接著就是寄送信件就可以了。

我們稍微調整一下 build() 的內容

public function build()
{
    return $this->from('example@example.com', 'Example')
                ->subject('訂單成立')
                ->view('emails.orders.shipped');
}

然後我們在 web.php 裡面建立測試寄件的路由

Route::get('/mail', function () {
    Mail::to("flamerecca711@gmail.com")->send(new OrderShipped());
});

接著我們連線 http://127.0.0.1/mail,如果順利的話,應該會看到一片白畫面。

如果看到類似 Target class [mail.manager] does not exist. 的文字,可能是 cache 沒有清乾淨,可以嘗試清理看看

./vendor/bin/sail composer dump-autoload
./vendor/bin/sail artisan config:clear

接著,我們到 mailhog 裡面檢查。連線 http://127.0.0.1:8025/

mailhog preview mail

這樣,我們的寄信功能就模擬完成了!

今天有關信件撰寫的部分,就先到這邊。各位明天見!


上一篇
Day 17:Laravel Middleware 簡介
下一篇
Day 19:使用寄信功能實作用戶認證信件
系列文
Laravel 9 漫遊,享受魔法般的極速網頁開發體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言